#ifndef MATERIAL_H
#define MATERIAL_H

class Entity;


#include "Program.h"
#include "Mesh/AttributeTemplate.h"
#include "Entity.h"
#include "Troll3D_global.h"
#include "Mesh/VertexTemplate.h"
#include "Uniform.h"
#include "GL/glew.h"

#include <vector>

using namespace std;

class TROLL3DSHARED_EXPORT Material{

    /************************************************
    /*				Public
    /************************************************/
    public :

        /************************************************
        /*				Constructors
        /************************************************/

            Material();

        /************************************************
        /*				Methods
        /************************************************/

            void                SetVertexTemplate(VertexTemplate & vt);
            VertexTemplate &    SetVertexTemplate();

            void    AddNewSharedUniform(Uniform *);
            void    AddNewUniform(Uniform *f);

            void    GetLocations();
            void    Use();
            GLuint  IdProgram();

            void AttachTo(Entity * entity);


        /************************************************
        /*				Get/Set
        /************************************************/

            void            Program(GLSLProgram    &   program);
            GLSLProgram &   Program();

        /************************************************
        /*				Properties
        /************************************************/

            VertexTemplate *    m_VertexTemplate;

            vector<Uniform*>    m_SharedUniform;
            vector<Uniform*>    m_Uniforms;

    /************************************************
    /*				Private
    /************************************************/
    private :

        /************************************************
        /*				Methods
        /************************************************/

            void    GetAttribLocations();
            void    GetUniformLocation();
            void    SendSharedUniforms();
            void    BindAttributes();

        /************************************************
        /*				Properties
        /************************************************/

            GLSLProgram *   m_Program;

};

#endif // MATERIAL_H
